package com.zjmzxfzhl.modules.app.controller;

import java.text.SimpleDateFormat;
import java.util.*;

import javax.validation.Valid;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
import com.zjmzxfzhl.common.core.exception.SysException;
import com.zjmzxfzhl.common.core.util.SecurityUtils;
import com.zjmzxfzhl.modules.app.entity.AppDoc;
import com.zjmzxfzhl.modules.app.entity.AppProj;
import com.zjmzxfzhl.modules.app.entity.AppTag;
import com.zjmzxfzhl.modules.app.entity.AppTask;
import com.zjmzxfzhl.modules.app.form.*;
import com.zjmzxfzhl.modules.app.service.AppDocService;
import com.zjmzxfzhl.modules.app.service.AppProjService;
import com.zjmzxfzhl.modules.sys.entity.vo.ElTree;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zjmzxfzhl.common.core.Result;
import com.zjmzxfzhl.common.core.base.BaseController;
import com.zjmzxfzhl.modules.app.service.AppTaskService;

/**
 * Controller
 * 
 * @author 张森荣
 */
@RestController
@RequestMapping("/app/task")
public class AppTaskController extends BaseController {
    @Autowired
    private AppTaskService appTaskService;

    @Autowired
    private AppDocService appDocService;

    @Autowired
    private AppProjService appProjService;
    /**
     * 自定义查询列表
     * 
     * @param appTaskVo
     * @param current
     * @param size
     * @param taskTags 通过标签查询任务多个标签用,隔开
     * @param myTask 通过标签查询任务多个标签用,隔开
     * @return
     */
//    @PreAuthorize("@elp.single('app:task:list')")
    @GetMapping(value = "/list")
    public Result list(AppTaskVo appTaskVo, @RequestParam Integer current, @RequestParam Integer size,Integer myTask,String taskTags) {
        //通过标签查询
        if(taskTags!=null&&!"".equals(taskTags)){
            String[] tagsArr = taskTags.split(",");
            List<AppTag> tags=new ArrayList<>();
            for (String s:tagsArr) {
                AppTag appTag=new AppTag();
                appTag.setTagId(s);
                tags.add(appTag);
            }
            appTaskVo.setTags(tags);
        }
        //查看我参与项目的任务
        String userId = SecurityUtils.getUserId();
        if(!"admin".equals(userId)){
            appTaskVo.setProjUserId(userId);
        }
        //查看我参与的任务
        if(myTask != null && myTask == 1){
            appTaskVo.setMyTask(userId);
        }else {
            appTaskVo.setMyTask(null);
        }
        IPage<AppTask> pageList = appTaskService.list(new Page<AppTask>(current, size), appTaskVo);
        return Result.ok(pageList);
    }

//    @PreAuthorize("@elp.single('app:task:list')")
    @GetMapping(value = "/queryById")
    public Result queryById(@RequestParam String id) {
        AppTask appTask = appTaskService.queryById(id);
        if(appTask==null){
            return Result.ok();
        }
        AppDocVo appDocVo=new AppDocVo();
        appDocVo.setDocType("01");
        appDocVo.setDeleted("0");
        appDocVo.setDocTypeId(appTask.getTaskId());
        List<AppDocVo> appDocList=appDocService.getList(null,appDocVo);
        appTask.setDocList(appDocList);

        //添加面包屑导航
        List<TaskCrumbVo> taskCrumbVos=appTaskService.taskCrumb(appTask.getTaskId());
        appTask.setTaskCrumb(taskCrumbVos);
        if(appTask.getProjId()!=null){
            List<ProjCrumbVo> projCrumbVos=appProjService.projCrumb(appTask.getProjId());
            appTask.setProjCrumb(projCrumbVos);
        }
        return Result.ok(appTask);
    }

    /**
     * @功能：新增
     * @param appTask
     * @return
     */
//    @PreAuthorize("@elp.single('app:task:save')")
    @PostMapping(value = "/save")
    public Result save(@Valid @RequestBody AppTask appTask) {
        if(appTask.getProjId()==null&&"".equals(appTask.getProjId())){
            return Result.error("项目id不能为空！");
        }
        Boolean result=appTaskService.saveAppTask(appTask);
        if(result==false){
            return Result.error("保存失败！");
        }
        return Result.ok();
    }

    /**
     * @功能：修改
     * @param appTask
     * @return
     */
//    @PreAuthorize("@elp.single('app:task:update')")
    @PutMapping(value = "/update")
    public Result update(@Valid @RequestBody AppTask appTask) {
        appTask.setParentTaskId(null);
        appTask.setTaskLevel(null);
        appTask.setTaskLevelCode(null);
        appTask.setIsLeaf(null);
        appTask.setProjId(null);
        Boolean result=appTaskService.updateAppTask(appTask);
        if(result==false){
            return Result.error("修改失败！");
        }
        return Result.ok();
    }

    /**
     * @功能：批量删除
     * @param ids
     * @return
     */
//    @PreAuthorize("@elp.single('app:task:delete')")
    @DeleteMapping(value = "/delete")
    public Result delete(@RequestParam String ids) {
        if (ids == null || ids.trim().length() == 0) {
            return Result.error("ids can't be empty");
        }
        Boolean result=appTaskService.delByIds(ids);
        if(result==false){
            return Result.error("检查目录下是否存在未删除子任务！");
        }
        return Result.ok();
    }

    /**
     *
     * @param current 页数（根节点查询使用）
     * @param size 大小（根节点查询使用）
     * @param parentId 父节点（无法与分页，查询条件混用）
     * @param level 展开层级（无法与分页，查询条件混用）
     * @param appTaskVo 查询条件
     * @param recentTask 查看最近的任务（根节点查询使用）（0:今日任务,1:本周任务,2:本月任务）
     * @param taskTags 通过标签查询任务多个标签用,隔开
     * @return total字段只在根节点查询有效
     */
//    @PreAuthorize("@elp.single('app:task:list')")
    @GetMapping(value = "/getTreeData")
    public Result getSelectTreeData(AppTaskVo appTaskVo,Integer current,Integer size,String parentId,Integer level,Integer recentTask,String taskTags) {
        // 默认返回当前用户数据权限范围的机构树
        String userId = SecurityUtils.getUserId();
        if(!"admin".equals(userId)){
            appTaskVo.setProjUserId(userId);
        }

        Map<String,Object> resultMap=new HashMap();
        if(recentTask!=null){
            Calendar cal=Calendar.getInstance();
            switch (recentTask) {
                case 0: //获取今日时间
                    break;
                case 1: //获取本周第一天
                    cal.add(Calendar.WEEK_OF_MONTH, 0);
                    cal.set(Calendar.DAY_OF_WEEK, 2);
                    break;
                case 2: //获取本月第一天
                    cal.add(Calendar.MONTH, 0);
                    cal.set(Calendar.DAY_OF_MONTH, 1);
                    break;
                default: appTaskVo.setStartDate(null);
            }
            //清空时分秒
            cal.set(Calendar.HOUR_OF_DAY, 0);//控制时
            cal.set(Calendar.MINUTE, 0);//控制分
            cal.set(Calendar.SECOND, 0);//控制秒
            cal.set(Calendar.MILLISECOND, 0);//控制毫秒
            appTaskVo.setStartDate(cal.getTime());
        }

        //通过标签查询
        if(taskTags!=null&&!"".equals(taskTags)){
            String[] tagsArr = taskTags.split(",");
            List<AppTag> tags=new ArrayList<>();
            for (String s:tagsArr) {
                AppTag appTag=new AppTag();
                appTag.setTagId(s);
                tags.add(appTag);
            }
            appTaskVo.setTags(tags);
        }
        List<ElTree> treeData = appTaskService.getTreeData(appTaskVo,current,size,parentId,level);
        resultMap.put("data",treeData);

        Integer total=appTaskService.selectRowCount(appTaskVo);
        resultMap.put("total",total);

        return Result.ok(resultMap);
    }

    /**
     * @功能：移动树
     * @param id 节点id
     * @param parentId 原父id
     * @param newParentId 目标父id
     * @return
     */
    @PreAuthorize("@elp.single('app:Dir:update')")
    @PutMapping(value = "/moveTree")
    public Result moveTree(@RequestParam String id,@RequestParam String parentId,@RequestParam String newParentId) {
        AppTask appTask=appTaskService.getById(id);
        if(appTask==null){
            return Result.error("未找到结点");
        }
        appTask.setParentTaskId(newParentId);
        appTaskService.moveTree(appTask,parentId);

        return Result.ok();
    }

    /**
     * 统计任务数量
     *
     * @return
     */
//    @PreAuthorize("@elp.single('app:dir:list')")
    @GetMapping(value = "/taskTotal")
    public Result taskTotal(AppTask appTask) {
        Map<String,Object> map=new HashMap<>();
        List<TaskTotalVo> taskTotalVos= appTaskService.taskTotal(appTask);
        TaskSumVo taskSumVo = appTaskService.getTaskSun(null,appTask.getProjId());
        map.put("taskTotal",taskTotalVos);
        map.put("taskSum",taskSumVo);
        return Result.ok(map);
    }

    /**
     * @功能： 任务变更{00.待办的,01.已确认,02.设计中,04.开发中,05.修复中,06.进行中,07.已完成,08.已验收,09.已取消,10.已拒绝,11.已中止}
     * @param taskId
     * @param status
     * @return
     */
//    @PreAuthorize("@elp.single('app:task:update')")
    @PutMapping(value = "/taskChange")
    public Result taskChange(@RequestParam String taskId,@RequestParam String status) {
        Boolean result =true;
        switch (status) {
            case "00": //待办的
                result =appTaskService.wait(taskId);
                break;
            case "01": //已确认
                result =appTaskService.confirmed(taskId);
                break;
            case "02": //设计中
                result =appTaskService.inDesign(taskId);
                break;
            case "04": //开发中
                result =appTaskService.inDevelop(taskId);
                break;
            case "05": //修复中
                result =appTaskService.inRepair(taskId);
                break;
            case "06": //进行中
                result =appTaskService.inProgress(taskId);
                break;
            case "07": //已完成
                result =appTaskService.finish(taskId);
                break;
            case "08": //已验收
                result =appTaskService.verified(taskId);
                break;
            case "09": //已取消
                result =appTaskService.cancel(taskId);
                break;
            case "10": //已拒绝
                result =appTaskService.refused(taskId);
                break;
            case "11": //已中止
                result =appTaskService.suspend(taskId);
                break;
            default: return Result.error("查找任务状态失败！");
        }
        if(result==false){
            return Result.error("任务状态更改失败！");
        }
        return Result.ok();
    }

    /**
     * 统计任务概括
     *
     * @return
     */
    //    @PreAuthorize("@elp.single('app:proj:list')")
    @GetMapping(value = "/summarize")
    public Result summarize() {
        String userId = SecurityUtils.getUserId();
        if (userId == null) {
            return Result.error("找不到用户");
        }
        TaskSumVo taskSumVo = appTaskService.getTaskSun(userId,null);
        return Result.ok(taskSumVo);
    }

    /**
     * 项目任务甘特图数据
     *
     * @return
     */
    //    @PreAuthorize("@elp.single('app:proj:list')")
    @GetMapping(value = "/ganttChart")
    public Result ganttChart(AppTaskVo appTaskVo) {
        List<TaskGanttVo> result=appTaskService.ganttChart(appTaskVo);
        return Result.ok(result);
    }

    /**
     * 项目任务甘特图数据
     *
     * @return
     */
    //    @PreAuthorize("@elp.single('app:proj:list')")
    @GetMapping(value = "/getMeetTask")
    public Result getMeetTask(String projIds) {
        if(projIds==null){
            return Result.error("请先选项目");
        }
        List<MeetTaskVo> result=new ArrayList<>();
        String[] idsArr = projIds.split(",");
        for (String id:idsArr) {
            MeetTaskVo meetTaskVo=new MeetTaskVo();
            AppProj appProj=appProjService.queryById(id);
            meetTaskVo.setProjId(appProj.getProjId());
            meetTaskVo.setName(appProj.getName());
            result.add(meetTaskVo);
        }
        for (MeetTaskVo meetTaskVo:result) {
            meetTaskVo.setChildren(appTaskService.getMeetTask(meetTaskVo.getProjId()));
        }

        return Result.ok(result);
    }

    /**
     * 项目任务甘特图数据
     *
     * @return
     */
    //    @PreAuthorize("@elp.single('app:proj:list')")
    @GetMapping(value = "/getTaskList")
    public Result getTaskList(String taskIds) {
        if(taskIds==null){
            return Result.error("请先选任务");
        }
        String[] idsArr = taskIds.split(",");
        List<AppTask> result=appTaskService.getTaskList(idsArr);
        return Result.ok(result);
    }

    /**
     * @功能：变更任务（时间）
     * @param appTask
     * @return
     */
//    @PreAuthorize("@elp.single('app:task:update')")
    @PutMapping(value = "/modiTask")
    public Result modiTask(@Valid @RequestBody AppTask appTask) {
        if (appTask.getTaskId() == null || appTask.getTaskId().trim().length() == 0) {
            return Result.error("变更任务编号不能为空！");
        }
        String userId = SecurityUtils.getUserId();
        if(!"admin".equals(userId)) {
            AppTask task = appTaskService.queryById(appTask.getTaskId());
            //修改时间完成时间时判断是否拥有权限
            if (task.getProjId() != null) {
                AppProj appProj = appProjService.queryById(task.getProjId());
                if (!userId.equals(appProj.getMasterUserId())) {
                    return Result.error("不是项目负责人无法变更任务时间！");
                }
            }
        }
        AppTask result=appTaskService.modiTask(appTask);
        if(result==null){
            return Result.error("修改失败！");
        }
        return Result.ok(result);
    }

    /**
     * 查询变更任务列表
     * @param taskId
     * @return
     */
//    @PreAuthorize("@elp.single('app:task:update')")
    @GetMapping(value = "/modiTaskList")
    public Result modiTaskList(String taskId) {
        List<AppTask> result=appTaskService.modiTaskList(taskId);
        return Result.ok(result);
    }

    /**
     * 获取项目任务周期
     * @param projId
     * @return
     */
//    @PreAuthorize("@elp.single('app:task:update')")
    @GetMapping(value = "/taskCycle")
    public Result taskCycle(String projId) {
        List<TaskCycleVo> result=appTaskService.taskCycle(projId);
        return Result.ok(result);
    }
}
